<?php

namespace Application\Model;

use Zend\Db\Adapter\Adapter;
use Zend\Db\Sql\Sql;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Application\Model\RechercheSejourTable;
use Zend\Db\Sql\Select;


class FiltreTable
{
    protected $table ='Filtre';
    protected $tableName ='Filtre';
    
    protected $tableGateway;
    protected $rechercheSejourTable;

    const MAJ_SEJOUR = 1;
    const AJOUTER_SEJOUR = 2;
    const SUPPRIMER_SEJOUR = 3;

    public function __construct(TableGateway $tableGateway, RechercheSejourTable $rechercheSejourTable)
    {
        $this->tableGateway = $tableGateway;
    	$this->rechercheSejourTable = $rechercheSejourTable;
    }
    
    public function fetchAll()
    {
        $resultSet = $this->tableGateway->select(function(Select $select){
            $select->order('libelleFiltre ASC');
        });
        
        return $resultSet;
    }

    public function fetchAllArray()
    {
        $resultSet = $this->fetchAll();
        $entities = array();
        
        foreach ($resultSet as $row) {
        	$obj = new Filtre();
        	$obj->exchangeArray( (array) $row);
        	$entities[] = $obj;
        }
        
        return $entities;
    }

    public function rechercherParmisLesFiltres( $recherche )
    {
        $resultSet = $this->tableGateway->select(function(Select $select) use($recherche) {
            // $select->quantifier('DISTINCT');
            // $select->join('Sejour', 'Sejour.paysId = Pays.idPays', array(), 'inner');
            $select->where->like('libelleFiltre', "%".$recherche."%");
            $select->order('libelleFiltre ASC');
        });
        
        return $this->toArray ($resultSet, $forceRetourArray = true);
    }

    public function toArray ($resultSet, $forceRetourArray = false)
    {
        $entities = array();
        
        foreach ($resultSet as $row) {
            $obj = new Filtre();
            $obj->exchangeArray( (array) $row);
            $entities[] = $obj;
        }
        
        if(count($entities) == 1 && !$forceRetourArray ) {
            return $entities[0];
        }

        // if( count($entities) == 0 ) {
        //     return null;
        // }

        return $entities;
    }
    
    public function retournerFiltreParLibelle(Filtre $Filtre)
    {
        $libelleFiltre = $Filtre->libelleFiltre;

        $resultSet = $this->tableGateway->select(function(Select $select) use($libelleFiltre) {
            $select->where->equalTo('libelleFiltre', $libelleFiltre);
        });

        return $this->toArray($resultSet);
    }

    /* Remet à 0 tous les compteurs de tous les filtres */
    public function reinitialiserTable() {
        $this->tableGateway->delete(array('libelleFiltre is not null'));
    }

    /*
        Prend un objet de type Séjour puis le décortique et insère les bons filtres dans la table FILTRE
    */
    public function majFiltreSejour(Sejour $sejour, $actionDuSejour = self::AJOUTER_SEJOUR) {

        $filtresRechercheSejour = "";

        // Pays - Région
            $regionpays = $sejour->libellePays;

            $filtresRechercheSejour = $this->concatenerFiltreSejour($filtresRechercheSejour, $regionpays);

            if( isset( $sejour->libelleRegions ) ) {
                $regionpays = $sejour->libelleRegions . " (".$regionpays.")";

                $filtresRechercheSejour = $this->concatenerFiltreSejour($filtresRechercheSejour, $sejour->libelleRegions);
            }

            $this->saveLibelleFiltre( $actionDuSejour, $regionpays );

        // Activite
            $this->saveLibelleFiltre( $actionDuSejour, $sejour->libelleAS );
            
            $filtresRechercheSejour = $this->concatenerFiltreSejour($filtresRechercheSejour, $sejour->libelleAS);

        // Type de séjour 
            $this->saveLibelleFiltre( $actionDuSejour, $sejour->libelleTS );

            $filtresRechercheSejour = $this->concatenerFiltreSejour($filtresRechercheSejour, $sejour->libelleTS);
        
        // Agence            
            // $this->saveLibelleFiltre( $actionDuSejour, $sejour->agenceLibelle . " (agence)" );
            // $filtresRechercheSejour = $this->concatenerFiltreSejour($filtresRechercheSejour, $sejour->agenceLibelle);

        // Titre du Séjour

            $filtresRechercheSejour = $this->concatenerFiltreSejour($filtresRechercheSejour, $sejour->titre);

        // Thématiques du séjour
            if( count($sejour->thematiques) > 0 ) {
                foreach ($sejour->thematiques as $key => $thematique) {
                    $filtresRechercheSejour = $this->concatenerFiltreSejour($filtresRechercheSejour, $thematique->themeLibelle);            
                }
            }

        // Enregistrement dans la table RECHERCHE_SEJOUR
            $this->rechercheSejourTable->majEntreeSejour( $sejour, $filtresRechercheSejour );
    }    

    private function concatenerFiltreSejour($variableConcatenee, $libelleFiltre) {

        if( !isset( $libelleFiltre ) ) {
            return $variableConcatenee;
        }

        if( !isset( $variableConcatenee ) ) {
            $variableConcatenee = $libelleFiltre;
        } else {
            $variableConcatenee .= " " . $libelleFiltre;
        }

        return $variableConcatenee;
    }

    public function saveLibelleFiltre($actionDuSejour, $libelleFiltre ) {

        if(!isset($libelleFiltre)) {
            return ;
        }

        $aFiltre = array();
        $filtre = new Filtre();

        $aFiltre['libelleFiltre'] = $libelleFiltre;

        $filtre->exchangeArray($aFiltre);

        $this->saveFiltre( $filtre, $actionDuSejour);
    }

    public function saveFiltre(Filtre $filtre, $actionDuSejour)
    {
        $idLibelleFiltre = null;
        $filtreBase = $this->retournerFiltreParLibelle($filtre);

        if( count( $filtreBase ) > 0 ) {

            if( $actionDuSejour == self::AJOUTER_SEJOUR ) {
                $filtreBase->nbrSejourFiltre++;
            } elseif ( $actionDuSejour == self::SUPPRIMER_SEJOUR ) {
                $filtreBase->nbrSejourFiltre--;
            }

            $idLibelleFiltre = $filtreBase->libelleFiltre;
        }
        
        if ( !isset( $idLibelleFiltre ) ) {
            $this->tableGateway->insert( (array) $filtre);
            
            $idLibelleFiltre = $this->tableGateway->lastInsertValue;
            
        } elseif( (int) $filtreBase->nbrSejourFiltre <= 0  ) {

            $this->tableGateway->delete(array('libelleFiltre' => $idLibelleFiltre));
        } else {

            $this->tableGateway->update( (array) $filtreBase, array('libelleFiltre' => $idLibelleFiltre));
        }
        
        return $idLibelleFiltre;
    }

    public function updateFiltreLibelle( $libelleFiltreActuel, $libelleFiltreNouveau ) {
        $aFiltre = array();
        $filtre = new Filtre();

        $aFiltre['libelleFiltre'] = $libelleFiltreActuel;

        $filtre->exchangeArray($aFiltre);

        $filtreBase = $this->retournerFiltreParLibelle($filtre);

        if( $filtreBase != null && count($filtreBase) == 0) {

            $filtreBase->libelleFiltre = $libelleFiltreNouveau;

            $this->tableGateway->update( (array) $filtreBase, array('libelleFiltre' => $libelleFiltreActuel));
        }

    }

}